package yasuoliu;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class demo1 {
    public static void main(String[] args) throws IOException {
        //要求 把src.zip压缩包解压缩
        //1.创建src对象表示要压缩文件
        File src = new File("E:\\src.zip");
        //2.创建解压缩文件的目的地

        File dest = new File("E:\\dest");
        //3.调用方法解压缩
        unzip(src, dest);
    }

    private static void unzip(File src, File dest) throws IOException {
        //创建解压缩流对象
        //解压的本质：就是把压缩包里的文件和文件夹读取出来，并且按照层级拷贝到目的地
        ZipInputStream zis = new ZipInputStream(new FileInputStream(src));
        //获取每一个Zipentry对象
        //每一个Zipentry对象表示压缩包里所有的文件和文件夹包括子文件和子文件夹
        ZipEntry entry;
        while ((entry = zis.getNextEntry()) != null) {
            //entry表示压缩包里所有的文件夹或者文件
            //判断entry是文件还是文件夹
            if (entry.isDirectory()) {
                //如果是文件夹，创建和src同名称的文件夹，entry对象包括多级路径，因为他能获取所有的子文件夹或者文件夹

                File dir = new File(dest, entry.getName());
                dir.mkdirs();
            }else {
                //如果是文件，也要创建和src同名称的文件，并且把压缩包里的文件读取出来，写入到文件中
                File file = new File(dest, entry.getName());
                //entry如果是有压缩包里的所有的文件或者子文件，所以不需要考虑Fuji文件路径的
                //只需考虑好放入那个盘符即可，dest已经考虑好了

                //创建字节流
                FileOutputStream fos=new FileOutputStream(file);
                //此时的fos已经创建好了文件
                //开始读取数据
                int len;
                while((len=zis.read())!=-1){
                    //把压缩把里的文件写入到dest目的地当中
                    fos.write(len);
                }

                //关闭流
                fos.close();
                //表示在压缩包中的一个文件处理完毕了
                zis.closeEntry();

            }
        }
        zis.close();
    }
}
